#include "Usuario.h"
#include "Grupo.h"
#include <string>
#include <iostream>

using namespace std;
int Usuario::ID=0;
/**
 * @brief Constructor por defecto
 * @param nom string nombre del usuario
 * @param pass string contraseña del usuario
 * @param _maxGrupos int número del tamaño del vector de grupo
 */
Usuario::Usuario(string nom,string pass,int _maxGrupos):nombre(nom),password(pass),id(ID),grupos(0),tam_grupos(0),max_grupos(_maxGrupos){
    grupos=new Grupo*[max_grupos];
    ID++;
}

/**
 * @brief Constructor de copia
 */
Usuario::Usuario(const Usuario& orig):
nombre(orig.nombre),password(orig.password),grupos(orig.grupos),id(ID){
    ID++;
}

/**
 * Destructor de la clase Usuario
 */
Usuario::~Usuario(){
    if(grupos) delete[] grupos;
}

/**
 * @brief Agrega un grupo al usuario
 * @param grupo Grupo* Puntero al grupo que se va a agregar
 * @pre Grupo* grupo debe estar inicializado, en caso de que el usuario no pueda pertenece
 * a más grupos aparecerá un mensaje
 */
void Usuario::AddGrupo(Grupo* grupo) {
    if(tam_grupos<max_grupos){
        this->grupos[tam_grupos++] = grupo;
        grupo->AddUsuario(this);
    }else{
        cout<<"El usuario no puede pertenecer a más grupos"<<endl;
    }
}

/**@brief Devuelve un vector de punteros a grupo
 * @return Vector de punteros a grupos en los que pertenesca el usuario 
 */
Grupo** Usuario::GetGrupos() const {
    return grupos;
}

/**@brief Asigna una contraseña al usuario
 *@param password string con la nueva contraseña que se le va a asignar
 */
void Usuario::SetPassword(string password) {
    this->password = password;
}

/**@brief Devuelve la contraseña del usuario
 * @return string con la contraseña que tenga el usuario
 */
string Usuario::GetPassword() const {
    return password;
}

/**@brief Asigna un nombre al usuario
 * @param nombre string con el nuevo nombre
 */
void Usuario::SetNombre(string nombre) {
    this->nombre = nombre;
}

/**@brief Devuelve el nombre del usuario
 * @param string con el nombre del usuario
 */
string Usuario::GetNombre() const {
    return nombre;
}



